/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DigaFoil;

import BD.*;
import GUI.Gui;
import GUI.PantallaPpal;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import javax.swing.JOptionPane;

/**
 *
 * @author ARMGARCES
 */
public class Controlador {
    /**
     * 
     */
    public  static final String PERSISTENCE_UNIT_NAME = "DigaFoilPU";
    
    private Usuario user;
    /**
     * 
     */
    private static Gui gui;
    /**
     * 
     */
    private static PantallaPpal ventana;

    /**
     * 
     */
    private Controlador() {
    }
    /**
     * 
     * @return 
     */
    public static Controlador getInstance() {
        return ControladorHolder.INSTANCE;
    }

    /**
     * @return the user
     */
    public Usuario getUser() {
        return user;
    }
    
    /**
     * @param aUser the user to set
     */
    public void setUser(Usuario aUser) {
        user = aUser;
    }
       
    /**
     * 
     */
    private static class ControladorHolder {

        private static final Controlador INSTANCE = new Controlador();
    }
    /**
     * 
     */
    public void iniciarPrograma(){
        gui = Gui.getInstance();
        gui.pantallaPpal();
        gui.iniciarSesion();
    }
    /**
     * 
     * @param _usuario 
     * @param _pswd
     * @return 
     */
    public Usuario iniciarSesion(String _usuario,char[] _pswd){
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            //use entity manager to retrieve named query
            Query findUsuario = em.createNamedQuery("Usuario.findUsuario");
            //set dynamic data for query
            findUsuario.setParameter("nombre", _usuario);
            findUsuario.setParameter("pswd", Tools.charArrayToString(_pswd));
            
            
            //execute query and get results
            List<Usuario> users = findUsuario.getResultList();
            
            
            for (Usuario _user : users) {   
                setUser(_user);
                em.refresh(user);
                if(user.getActivo()){
                    gui.updateSesion();
                    Log.getInstance().iniciarSesion();   
                    Procesos p = new Procesos();
                    p.actualizarSesion();
                    return user;
                }else{
                    String mnsj  = "Usuario Inactivo, por favor contacte a su superior!";
                    String title = "Error de Inicio de Sesion";
                    JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
                    return null;
                }
            }            
            em.close();
            String mnsj  = "Usuario o Contraseña no coincide, por favor intente de nuevo!";
            String title = "Error de Inicio de Sesion";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 
     * @return 
     */
    public boolean cerrarSesion(){
        setUser(null);
        gui.updateSesion();
        return Log.getInstance().cerrarSesion();
    }
    /**
     * 
     */
    public void actualizarSesion(){
        gui.updateSesion();
    }
    
    /**
     * 
     * @return 
     */
    public List<Rol> getRoles(){
        List<Rol> result = new ArrayList<Rol>();
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();

            //use entity manager to retrieve named query
            Query findRoles = em.createNamedQuery("Rol.findAll");
            
            //execute query and get results
            result = findRoles.getResultList();
            //em.refresh(result);
            em.close();
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
        return result;
    }
    
    /**
     * 
     * @param tipo 
     * @return 
     */
    public List<Lugar> getLugares(TipoLugar tipo){
        List<Lugar> result = new ArrayList<Lugar>();
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            Query find;
            if(tipo == null){
                //use entity manager to retrieve named query
                find = em.createNamedQuery("Lugar.findAll");
            }else{
                find = em.createNamedQuery("Lugar.findByTipo");
                find.setParameter("tipo",tipo.getId()-1);
            }                
            //execute query and get results
            result = find.getResultList();
           
            em.close();
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 
     * @return 
     */
    public List<Proveedor> getProveedores(){
        List<Proveedor> result = new ArrayList<Proveedor>();
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            Query find;
            find = em.createNamedQuery("Proveedor.findAll");
                         
            //execute query and get results
            result = find.getResultList();
           
            em.close();
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
        return result;
    }
    
    /**
     * 
     * @param _user
     */
    public void addUsuario(Usuario _user){
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            
            em.getTransaction().begin();
            
            em.persist(_user);
            
            em.getTransaction().commit();
            em.close();
            
            Log.getInstance().addUsuario(_user);
            
            String mnsj  = "Usuario agregado correctamente!";
            String title = "Mensaje del Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.INFORMATION_MESSAGE);
            
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Persistencia";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();            
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();            
        }
    }
    
    /**
     * 
     * @param _nuevo 
     */
    public void addLugar(Lugar _nuevo) {
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            
            em.getTransaction().begin();
            
            em.persist(_nuevo);
            
            em.getTransaction().commit();
            em.close();
            
            Log.getInstance().addLugar(_nuevo);
            
            String mnsj  = "Lugar agregado correctamente!";
            String title = "Mensaje del Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.INFORMATION_MESSAGE);
            
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Persistencia";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();            
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();            
        }
    }
    
    /**
     * 
     * @param _obj
     */
    public void addProveedor(Proveedor _obj){
        try{
            EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            EntityManager em = factory.createEntityManager();
            
            em.getTransaction().begin();
            
            em.persist(_obj);
            
            em.getTransaction().commit();
            em.close();
            
            Log.getInstance().addProveedor(_obj);
            
            String mnsj  = "Proveedor agregado correctamente!";
            String title = "Mensaje del Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.INFORMATION_MESSAGE);
            
        }catch(PersistenceException pe){
            String mnsj  = "Error de Sistema, por Favor Intente Luego!";
            String title = "Error de Persistencia";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            pe.printStackTrace();            
        }catch(Exception e){
            String mnsj  = "Error Inesperado, por Favor Intente Luego!";
            String title = "Error de Sistema";
            JOptionPane.showMessageDialog(gui.getPantalla(),mnsj,title, JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();            
        }
    }
}
